home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / alib / csup / math_support / ffpafp.asm < prev    next >
Assembly Source File  |  1994-02-14  |  12KB  |  257 lines

  1. *      TTL     FAST FLOATING POINT ASCII TO FLOAT (FFPAFP)
  2. ************************************
  3. * (C) COPYRIGHT 1980 MOTORLA INC.  *
  4. ************************************
  5.  
  6. **********************************************************
  7. *                        FFPAFP                          *
  8. *                    ASCII TO FLOAT                      *
  9. *                                                        *
  10. *      INPUT:  A0 - POINTER TO ASCII STRING OF FORMAT    *
  11. *                   DESCRIBED BELOW                      *
  12. *                                                        *
  13. *      OUTPUT: D7 - FAST FLOATING POINT EQUIVALENT       *
  14. *              A0 - POINTS TO THE CHARACTER WHICH        *
  15. *                   TERMINATED THE SCAN                  *
  16. *                                                        *
  17. *      CONDITION CODES:                                  *
  18. *                N - SET IF RESULT IS NEGATIVE           *
  19. *                Z - SET IF RESULT IS ZERO               *
  20. *                V - SET IF RESULT OVERFLOWED            *
  21. *                C - SET IF INVALID FORMAT DETECTED      *
  22. *                X - UNDEFINED                           *
  23. *                                                        *
  24. *      REGISTERS D3 THRU D6 ARE CHANGED                  *
  25. *                                                        *
  26. *      CODE SIZE: 246 BYTES     STACK WORK: 8 BYTES      *
  27. *                                                        *
  28. *      INPUT FORMAT:                                     *
  29. *                                                        *
  30. *     {SIGN}{DIGITS}{'.'}{DIGITS}{'E'}{SIGN}{DIGITS}     *
  31. *     <*********MANTISSA********><*****EXPONENT****>     *
  32. *                                                        *
  33. *                   SYNTAX RULES                         *
  34. *          BOTH SIGNS ARE OPTIONAL AND ARE '+' OR '-'.   *
  35. *          THE MANTISSA MUST BE PRESENT.                 *
  36. *          THE EXPONENT NEED NOT BE PRESENT.             *
  37. *          THE MANTISSA MAY LEAD WITH A DECIMAL POINT.   *
  38. *          THE MANTISSA NEED NOT HAVE A DECIMAL POINT.   *
  39. *                                                        *
  40. *      EXAMPLES:  ALL OF THESE VALUES REPRESENT THE      *
  41. *                 NUMBER ONE-HUNDRED-TWENTY.             *
  42. *                                                        *
  43. *                       120            .120E3            *
  44. *                       120.          +.120E+03          *
  45. *                      +120.          0.000120E6         *
  46. *                   0000120.00  1200000E-4               *
  47. *                               1200000.00E-0004         *
  48. *                                                        *
  49. *      FLOATING POINT RANGE:                             *
  50. *                                                        *
  51. *          FAST FLOATING POINT SUPPORTS THE VALUE ZERO   *
  52. *          AND NON-ZERO VALUES WITHIN THE FOLLOWING      *
  53. *          BOUNDS -                                      *
  54. *                                                        *
  55. *                   18                             20    *
  56. *    9.22337177 X 10   > +NUMBER >  5.42101070 X 10      *
  57. *                                                        *
  58. *                   18                             -20   *
  59. *   -9.22337177 X 10   > -NUMBER > -2.71050535 X 10      *
  60. *                                                        *
  61. *      PRECISION:                                        *
  62. *                                                        *
  63. *          THIS CONVERSION RESULTS IN A 24 BIT PRECISION *
  64. *          WITH GUARANTEED ERROR LESS THAN OR EQUAL TO   *
  65. *          ONE-HALF LEAST SIGNIFICANT BIT.               *
  66. *                                                        *
  67. *                                                        *
  68. *      NOTES:                                            *
  69. *          1) THIS ROUTINE CALLS THE DUAL-BINARY TO FLOAT*
  70. *             ROUTINE AND CAN BE USED AS AN ILLUSTRATION *
  71. *             OF HOW TO 'FRONT-END' THAT ROUTINE WITH    *
  72. *             A CUSTOMIZED SCANNER.                      *
  73. *          2) UNDERFLOWS RETURN A ZERO WITHOUT ANY       *
  74. *             INDICATORS SET.                            *
  75. *          3) OVERFLOWS WILL RETURN THE MAXIMUM VALUE    *
  76. *             POSSIBLE WITH PROPER SIGN AND THE 'V' BIT  *
  77. *             SET IN THE CCR.                            *
  78. *          4) IF THE 'C' BIT IN THE CCR INDICATES AN     *
  79. *             INVALID PATTERN DETECTED, THEN A0 WILL     *
  80. *             POINT TO THE INVALID CHARACTER.            *
  81. *                                                        *
  82. *      LOGIC SUMMARY:                                    *
  83. *                                                        *
  84. *          A) PROCESS LEADING SIGN                       *
  85. *          B) PROCESS PRE-DECIMALPOINT DIGITS AND        *
  86. *             INCREMENT 10 POWER BIAS FOR EACH           *
  87. *             DIGIT BYPASSED DUE TO 32 BIT OVERFLOW      *
  88. *          C) PROCESS POST-DECIMALPOINT DIGITS           *
  89. *             DECREMENTING THE 10 POWER BIAS FOR EACH    *
  90. *          D) PROCESS THE EXPONENT                       *
  91. *          E) ADD THE 10 POWER BIAS TO THE EXPONENT      *
  92. *          F) CALL 'FFPDBF' ROUTINE TO FINISH CONVERSION *
  93. *                                                        *
  94. *   TIMES: (8 MHZ NO WAIT STATES)                        *
  95. *          374 MICROSECONDS CONVERTING THE STRING        *
  96. *                                                        *
  97. *                                                        *
  98. **********************************************************
  99.          PAGE
  100. *FFPAFP   IDNT      1,1       FFP ASCII TO FLOAT
  101.  
  102. *         OPT       PCS
  103.  
  104.          XDEF      FFPAFP    ENTRY POINT
  105.          XREF      FFPDBF
  106.  
  107.  
  108. FFPAFP   MOVEQ     #0,D7     CLEAR MANTISSA BUILD
  109.          MOVEQ     #0,D6     CLEAR SIGN+BASE10 BUILD
  110.  
  111. * CHECK FOR LEADING SIGN
  112.          BSR       FPANXT    OBTAIN NEXT CHARACTER
  113.          BEQ.S     FPANMB    BRANCH DIGIT FOUND
  114.          BCS.S     FPANOS    BRANCH NO SIGN ENCOUNTERED
  115.  
  116. * LEADING SIGN ENCOUNTERED
  117.          CMP.B     #'-',D5   COMPARE FOR MINUS
  118.          SEQ.B     D6        SET ONES IF SO
  119.          SWAP.W    D6        SIGN TO HIGH WORD IN D6
  120.  
  121. * TEST FOR DIGIT OR PERIOD
  122.          BSR       FPANXT    OBTAIN NEXT CHARACTER
  123.          BEQ.S     FPANMB    BRANCH DIGIT TO BUILD MANTISSA
  124. FPANOS   CMP.B     #'.',D5   ? LEADING DECIMALPOINT
  125.          BNE.S     FPABAD    BRANCH INVALID PATTERN IF NOT
  126.  
  127. * INSURE AT LEAST ONE DIGIT
  128.          BSR       FPANXT    OBTAIN NEXT CHARACTER
  129.          BEQ.S     FPADOF    BRANCH IF FRACTION DIGIT
  130.  
  131. * INVALID PATTERN DETECTED
  132. FPABAD   SUBQ.L    #1,A0     POINT TO INVALID CHARACTER
  133. *        ORI       #$01,CCR  SET CARRY BIT ON
  134.          DC.L      $003C0001 ****ASSEMBLER ERROR****
  135.          RTS                 RETURN
  136.  
  137. * PRE-DECIMALPOINT MANTISSA BUILD
  138. FPANXD   BSR       FPANXT    NEXT CHARACTER
  139.          BNE.S     FPANOD    BRANCH NOT A DIGIT
  140. FPANMB   BSR.S     FPAX10    MULTIPLY TIMES TEN
  141.          BCC.S     FPANXD    LOOP FOR MORE DIGITS
  142.  
  143. * PRE-DECIMALPOINT MANTISSA OVERFLOW, COUNT TILL END OR DECIMAL REACHED
  144. FPAMOV   ADDQ.W    #1,D6     INCREMENT TEN POWER BY ONE
  145.          BSR.S     FPANXT    OBTAIN NEXT PATTERN
  146.          BEQ.S     FPAMOV    LOOP UNTIL NON-DIGIT
  147.          CMP.B     #'.',D5   ? DECIMAL POINT REACHED
  148.          BNE.S     FPATSE    NO, NO CHECK FOR EXPONENT
  149.  
  150. * FLUSH REMAINING FRACTIONAL DIGITS
  151. FPASRD   BSR.S     FPANXT    NEXT CHARACTER
  152.          BEQ.S     FPASRD    IGNORE IT IF STILL DIGIT
  153. FPATSE   CMP.B     #'E',D5   ? EXPONENT HERE
  154.          BNE.S     FPACNV    NO, FINISHED - GO CONVERT
  155.  
  156. * NOW PROCESS THE EXPONENT
  157.          BSR.S     FPANXT    OBTAIN FIRST DIGIT
  158.          BEQ.S     FPANTE    BRANCH GOT IT
  159.          BCS.S     FPABAD    BRANCH INVALID FORMAT, NO SIGN OR DIGITS
  160.          ROL.L     #8,D6     HIGH BYTE OF D6 INTO LOW
  161.          CMP.B     #'-',D5   ? MINUS SIGN
  162.          SEQ.B     D6        SET ONES OR ZERO
  163.          ROR.L     #8,D6     D6 HIGH BYTE IS EXPONENTS SIGN
  164.          BSR.S     FPANXT    NOW TO FIRST DIGIT
  165.          BNE.S     FPABAD    BRANCH INVALID - DIGIT EXPECTED
  166.  
  167. * PROCESS EXPONENT'S DIGITS
  168. FPANTE   MOVE.W    D5,D4     COPY DIGIT JUST LOADED
  169. FPANXE   BSR.S     FPANXT    EXAMINE NEXT CHARACTER
  170.          BNE.S     FPAFNE    BRANCH END OF EXPONENT
  171.          MULU.W    #10,D4    PREVIOUS VALUE TIMES TEN
  172.          CMP.W     #2000,D4  ? TOO LARGE
  173.          BHI.S     FPABAD    BRANCH EXPONENT WAY OF BASE
  174.          ADD.W     D5,D4     ADD LATEST DIGIT
  175.          BRA.S     FPANXE    LOOP FOR NEXT CHARACTER
  176.  
  177. * ADJUST FOR SIGN AND ADD TO ORIGINAL INDEX
  178. FPAFNE   TST.L     D6        ? WAS EXPONENT NEGATIVE
  179.          BPL.S     FPAADP    BRANCH IF SO
  180.          NEG.W     D4        CONVERT TO NEGATIVE VALUE
  181. FPAADP   ADD.W     D4,D6     FINAL RESULT
  182. FPACNV   SUBQ.L    #1,A0     POINT TO TERMINATOR
  183.          JMP       FFPDBF    NOW CONVERT TO FLOAT
  184.  
  185. * PRE-DECIMALPOINT NON-DIGIT ENCOUNTERED
  186. FPANOD   CMP.B     #'.',D5   ? DECIMAL POINT HERE
  187.          BNE.S     FPATSE    NOPE, TRY FOR THE 'E'
  188.  
  189. * POST-DECIMALPOINT PROCESSING
  190. FPADPN   BSR.S     FPANXT    OBTAIN NEXT CHARACTER
  191.          BNE.S     FPATSE    NOT A DIGIT, TEST FOR E'
  192. FPADOF   BSR.S     FPAX10    TIMES TEN PREVIOUS VALUE
  193.          BCS.S     FPASRD    FLUSH IF OVERFLOW NOW
  194.          SUBQ.W    #1,D6     ADJUST 10 POWER BIAS
  195.          BRA.S     FPADPN    AND TO NEXT CHARACTER
  196.  
  197. *   *
  198. *   * FPAX10 SUBROUTINE - PROCESS NEXT DIGIT
  199. *   *  OUTPUT: C=0 NO OVERFLOW, C=1 OVERFLOW (D7 UNALTERED)
  200. *   *
  201. FPAX10   MOVE.L    D7,D3     COPY VALUE
  202.          LSL.L     #1,D3     TIMES TWO
  203.          BCS.S     FPAXRT    RETURN IF OVERFLOW
  204.          LSL.L     #1,D3     TIMES FOUR
  205.          BCS.S     FPAXRT    RETURN IF OVERFLOW
  206.          LSL.L     #1,D3     TIMES EIGHT
  207.          BCS.S     FPAXRT    RETURN IF OVERFLOW
  208.          ADD.L     D7,D3     ADD ONE TO MAKE X 9
  209.          BCS.S     FPAXRT    RETURN IF OVERFLOW
  210.          ADD.L     D7,D3     ADD ONE TO MAKE X 10
  211.          BCS.S     FPAXRT    RETURN IF OVERFLOW
  212.          ADD.L     D5,D3     ADD NEW UNITS DIGIT
  213.          BCS.S     FPAXRT    RETURN IF OVERFLOW
  214.          MOVE.L    D3,D7     UPDATE RESULT
  215. FPAXRT   RTS                 RETURN
  216.  
  217.  
  218. *
  219. * FPANXT SUBROUTINE - RETURN NEXT INPUT PATTERN
  220. *
  221. *    INPUT:  A0
  222. *
  223. *    OUTPUT:  A0 INCREMENTED BY ONE
  224. *             IF Z=1 THEN DIGIT ENCOUNTERED AND D5.L SET TO BINARY VALUE
  225. *             IF Z=0 THEN D6.B SET TO CHARACTER ENCOUNTERED
  226. *                         AND C=0 IF PLUS OR MINUS SIGN
  227. *                             C=1 IF NOT PLUS OR MINUS SIGN
  228. *
  229.  
  230. FPANXT   MOVEQ     #0,D5     ZERO RETURN REGISTER
  231.          MOVE.B    (A0)+,D5  LOAD CHARACTER
  232.          CMP.B     #'+',D5   ? PLUS SIGN
  233.          BEQ.S     FPASGN    BRANCH IF SIGN
  234.          CMP.B     #'-',D5   ? MINUS SIGN
  235.          BEQ.S     FPASGN    BRANCH IF SIGN
  236.          CMP.B     #'0',D5   ? LOWER THAN A DIGIT
  237.          BCS.S     FPAOTR    BRANCH IF NON-SIGNDIGIT
  238.          CMP.B     #'9',D5   ? HIGHER THAN A DIGIT
  239.          BHI.S     FPAOTR    BRANCH IF NON-SIGNDIGIT
  240. * IT IS DIGIT
  241.          AND.B     #$0F,D5   TO BINARY
  242. *        MOVE.W    #$0004,CCR SET Z=1 AND C=0
  243.          DC.L      $44FC0004 ***ASSEMBLER ERROR***
  244.          RTS                 RETURN
  245. * IT IS SIGN
  246. FPASGN   EQU       *
  247. *        MOVE.W    #$0000,CCR SET Z=0 AND C=0
  248.          DC.L      $44FC0000 ***ASSEMBLER ERROR***
  249.          RTS                 RETURN
  250. * IT IS NEITHER SIGN NOR DIGIT
  251. FPAOTR   EQU       *
  252. *        MOVE.W    #$0001,CCR SET Z=0 AND C=1
  253.          DC.L      $44FC0001 ***ASSEMBLER ERROR***
  254.          RTS                 RETURN
  255.  
  256.          END
  257.